package sword.offer;

/**
 * 在一个数组 nums 中除一个数字只出现一次之外，其他数字都出现了三次。请找出那个只出现一次的数字。
 * 输入：nums = [3,4,3,3]
 * 输出：4
 * @author 胡宇轩
 * @Email: yuxuan.hu01@bianlifeng.com
 */
public class FiftySixII {
    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.singleNumber(new int[]{14,14,14,12});
    }
    static class Solution {
        public int singleNumber(int[] nums) {
            //最终的结果值
            int res = 0;
            //int类型有32位，统计每一位1的个数
            for (int i = 0; i < 32; i++) {
                //统计第i位中1的个数
                int oneCount = 0;
                for (int j = 0; j < nums.length; j++) {
                    oneCount += (nums[j] >>> i) & 1;
                }
                //如果1的个数不是3的倍数，说明那个只出现一次的数字
                //的二进制位中在这一位是1
                if (oneCount % 3 == 1)
                    res |= 1 << i;
            }
            return res;
        }
    }
}
